shell_integration/macOS/FileProviderUIExt: Adapt FileProviderUIExt sharing to Nextclo...
authorClaudio Cambra <claudio.cambra@nextcloud.com>
Wed, 4 Dec 2024 09:08:55 +0000 (17:08 +0800)
committerMatthieu Gallien <matthieu.gallien@nextcloud.com>
Thu, 6 Feb 2025 11:24:09 +0000 (12:24 +0100)
Signed-off-by: Claudio Cambra <claudio.cambra@nextcloud.com>
shell_integration/MacOSX/NextcloudIntegration/FileProviderUIExt/Sharing/ShareController.swift
shell_integration/MacOSX/NextcloudIntegration/FileProviderUIExt/Sharing/ShareOptionsView.swift
shell_integration/MacOSX/NextcloudIntegration/FileProviderUIExt/Sharing/ShareTableViewDataSource.swift
shell_integration/MacOSX/NextcloudIntegration/FileProviderUIExt/Sharing/ShareViewController.swift
shell_integration/MacOSX/NextcloudIntegration/FileProviderUIExt/Sharing/ShareeSuggestionsDataSource.swift

index 161d1870068d90681ccbe6fb027eb5b5d42917b6..013a897a69e55fd5b84ea6cde7c64b2a12445c52 100644 (file)
@@ -7,14 +7,17 @@
 
 import Combine
 import Foundation
+import NextcloudFileProviderKit
 import NextcloudKit
 import OSLog
 
 class ShareController: ObservableObject {
     @Published private(set) var share: NKShare
     private let kit: NextcloudKit
+    private let account: Account
 
     static func create(
+        account: Account,
         kit: NextcloudKit,
         shareType: NKShare.ShareType,
         itemServerRelativePath: String,
@@ -38,6 +41,7 @@ class ShareController: ObservableObject {
                     publicUpload: publicUpload,
                     password: password,
                     permissions: permissions,
+                    account: account.ncKitAccount,
                     options: options
                 ) { account, share, data, error in
                     defer { continuation.resume(returning: error) }
@@ -65,8 +69,8 @@ class ShareController: ObservableObject {
                     shareWith: shareWith,
                     password: password,
                     permissions: permissions,
-                    options: options,
-                    attributes: attributes
+                    attributes: attributes,
+                    account: account.ncKitAccount
                 ) { account, share, data, error in
                     defer { continuation.resume(returning: error) }
                     guard error == .success else {
@@ -82,7 +86,8 @@ class ShareController: ObservableObject {
         }
     }
 
-    init(share: NKShare, kit: NextcloudKit) {
+    init(share: NKShare, account: Account, kit: NextcloudKit) {
+        self.account = account
         self.share = share
         self.kit = kit
     }
@@ -110,6 +115,7 @@ class ShareController: ObservableObject {
                 label: label,
                 hideDownload: hideDownload,
                 attributes: attributes,
+                account: account.ncKitAccount,
                 options: options
             ) { account, share, data, error in
                 Logger.shareController.info(
@@ -134,7 +140,9 @@ class ShareController: ObservableObject {
     func delete() async -> NKError? {
         Logger.shareController.info("Deleting share: \(self.share.url, privacy: .public)")
         return await withCheckedContinuation { continuation in
-            kit.deleteShare(idShare: share.idShare) { account, error in
+            kit.deleteShare(
+                idShare: share.idShare, account: account.ncKitAccount
+            ) { account, _, error in
                 Logger.shareController.info(
                     """
                     Received delete response: \(self.share.url, privacy: .public)
index 3e16a34ccff3d7137c0ff5bc84a1c652115dc690..5614f2139d7c6a58ba4a0e9f31884bf5b8b62217 100644 (file)
@@ -7,6 +7,7 @@
 
 import AppKit
 import Combine
+import NextcloudFileProviderKit
 import NextcloudKit
 import OSLog
 import SuggestionsTextFieldKit
@@ -34,16 +35,17 @@ class ShareOptionsView: NSView {
     @IBOutlet private weak var circleShare: NSMenuItem!
     @IBOutlet private weak var talkConversationShare: NSMenuItem!
 
-    var kit: NextcloudKit? {
+    let kit = NextcloudKit.shared
+    var account: Account? {
         didSet {
-            Logger.shareOptionsView.info("Setting up the kit.")
-            guard let kit = kit else {
+            Logger.shareOptionsView.info("Setting up account.")
+            guard let account else {
                 Logger.shareOptionsView.error("Could not configure suggestions data source.")
                 return
             }
 
             suggestionsTextFieldDelegate.suggestionsDataSource = ShareeSuggestionsDataSource(
-                kit: kit
+                account: account, kit: kit
             )
             suggestionsTextFieldDelegate.confirmationHandler = { suggestion in
                 guard let sharee = suggestion?.data as? NKSharee else { return }
@@ -255,13 +257,13 @@ class ShareOptionsView: NSView {
             guard !createMode else {
                 Logger.shareOptionsView.info("Creating new share!")
 
-                guard let dataSource = dataSource,
-                      let kit = kit,
+                guard let dataSource,
+                      let account,
                       let itemServerRelativePath = dataSource.itemServerRelativePath
                 else {
                     Logger.shareOptionsView.error("Cannot create new share due to missing data.")
                     Logger.shareOptionsView.error("dataSource: \(self.dataSource, privacy: .public)")
-                    Logger.shareOptionsView.error("kit: \(self.kit, privacy: .public)")
+                    Logger.shareOptionsView.error("account: \(self.account != nil, privacy: .public)")
                     Logger.shareOptionsView.error(
                         "path: \(self.dataSource?.itemServerRelativePath ?? "", privacy: .public)"
                     )
@@ -280,6 +282,7 @@ class ShareOptionsView: NSView {
                 deleteButton.isEnabled = false
                 saveButton.isEnabled = false
                 let error = await ShareController.create(
+                    account: account,
                     kit: kit,
                     shareType: selectedShareType,
                     itemServerRelativePath: itemServerRelativePath,
index 31d9b578fc68e253c51ab75ca67022f57e7fd992..f315b1635518da6a83fcd21eaf40358e942e15dd 100644 (file)
@@ -17,6 +17,8 @@ class ShareTableViewDataSource: NSObject, NSTableViewDataSource, NSTableViewDele
     private let shareItemViewNib = NSNib(nibNamed: "ShareTableItemView", bundle: nil)
     private let reattemptInterval: TimeInterval = 3.0
 
+    let kit = NextcloudKit.shared
+
     var uiDelegate: ShareViewDataSourceUIDelegate?
     var sharesTableView: NSTableView? {
         didSet {
@@ -30,21 +32,23 @@ class ShareTableViewDataSource: NSObject, NSTableViewDataSource, NSTableViewDele
     var capabilities: Capabilities?
     var itemMetadata: NKFile?
 
-    private(set) var kit: NextcloudKit?
     private(set) var itemURL: URL?
     private(set) var itemServerRelativePath: String?
     private(set) var shares: [NKShare] = [] {
         didSet { Task { @MainActor in sharesTableView?.reloadData() } }
     }
-    private var account: Account? {
+    private(set) var account: Account? {
         didSet {
             guard let account = account else { return }
-            kit = NextcloudKit()
-            kit?.setup(
+            kit.appendSession(
+                account: account.ncKitAccount,
+                urlBase: account.serverUrl,
                 user: account.username,
                 userId: account.username,
                 password: account.password,
-                urlBase: account.serverUrl
+                userAgent: "Nextcloud-macOS/FileProviderUIExt",
+                nextcloudVersion: 25,
+                groupIdentifier: ""
             )
         }
     }
@@ -109,11 +113,13 @@ class ShareTableViewDataSource: NSObject, NSTableViewDataSource, NSTableViewDele
                 presentError("Server does not support shares.")
                 return
             }
-            guard let kit else {
-                presentError("NextcloudKit instance is unavailable, cannot reload data!")
+            guard let account else {
+                presentError("Account data is unavailable, cannot reload data!")
                 return
             }
-            itemMetadata = await fetchItemMetadata(itemRelativePath: serverPathString, kit: kit)
+            itemMetadata = await fetchItemMetadata(
+                itemRelativePath: serverPathString, account: account, kit: kit
+            )
             guard itemMetadata?.permissions.contains("R") == true else {
                 presentError("This file cannot be shared.")
                 return
@@ -136,15 +142,17 @@ class ShareTableViewDataSource: NSObject, NSTableViewDataSource, NSTableViewDele
         let rawIdentifier = itemIdentifier.rawValue
         Logger.sharesDataSource.info("Fetching shares for item \(rawIdentifier, privacy: .public)")
 
-        guard let kit = kit else {
-            self.presentError("NextcloudKit instance is unavailable, cannot fetch shares!")
+        guard let account else {
+            self.presentError("NextcloudKit instance or account is unavailable, cannot fetch shares!")
             return []
         }
 
         let parameter = NKShareParameter(path: itemRelativePath)
 
         return await withCheckedContinuation { continuation in
-            kit.readShares(parameters: parameter) { account, shares, data, error in
+            kit.readShares(
+                parameters: parameter, account: account.ncKitAccount
+            ) { account, shares, data, error in
                 let shareCount = shares?.count ?? 0
                 Logger.sharesDataSource.info("Received \(shareCount, privacy: .public) shares")
                 defer { continuation.resume(returning: shares ?? []) }
@@ -157,9 +165,14 @@ class ShareTableViewDataSource: NSObject, NSTableViewDataSource, NSTableViewDele
     }
 
     private func fetchCapabilities() async -> Capabilities? {
+        guard let account else {
+            self.presentError("Could not fetch capabilities as account is invalid.")
+            return nil
+        }
+
         return await withCheckedContinuation { continuation in
-            kit?.getCapabilities { account, capabilitiesJson, error in
-                guard error == .success, let capabilitiesJson = capabilitiesJson else {
+            kit.getCapabilities(account: account.ncKitAccount) { account, data, error in
+                guard error == .success, let capabilitiesJson = data?.data else {
                     self.presentError("Error getting server caps: \(error.errorDescription)")
                     continuation.resume(returning: nil)
                     return
index 058708a653d9f7060c7af826efb9a98cfc9d1c9e..79f6054c653837bdb62d4d4c93c21ba2c8c783a9 100644 (file)
@@ -144,8 +144,8 @@ class ShareViewController: NSViewController, ShareViewDataSourceUIDelegate {
     }
 
     @IBAction func createShare(_ sender: Any) {
-        guard let kit = shareDataSource.kit else { return }
-        optionsView.kit = kit
+        guard let account = shareDataSource.account else { return }
+        optionsView.account = account
         optionsView.createMode = true
         tableView.deselectAll(self)
         if !splitView.arrangedSubviews.contains(optionsView) {
@@ -176,9 +176,11 @@ class ShareViewController: NSViewController, ShareViewDataSourceUIDelegate {
     }
 
     func showOptions(share: NKShare) {
-        guard let kit = shareDataSource.kit else { return }
-        optionsView.kit = kit
-        optionsView.controller = ShareController(share: share, kit: kit)
+        guard let account = shareDataSource.account else { return }
+        optionsView.account = account
+        optionsView.controller = ShareController(
+            share: share, account: account, kit: shareDataSource.kit
+        )
         if !splitView.arrangedSubviews.contains(optionsView) {
             splitView.addArrangedSubview(optionsView)
             optionsView.isHidden = false
index cc1b91fe3951ee9cbb5aee21c28e868dd6eae242..0987cd7282b9beda54ec90471715a239aaad3337 100644 (file)
@@ -6,18 +6,21 @@
 //
 
 import Foundation
+import NextcloudFileProviderKit
 import NextcloudKit
 import OSLog
 import SuggestionsTextFieldKit
 
 class ShareeSuggestionsDataSource: SuggestionsDataSource {
     let kit: NextcloudKit
+    let account: Account
     var suggestions: [Suggestion] = []
     var inputString: String = "" {
         didSet { Task { await updateSuggestions() } }
     }
 
-    init(kit: NextcloudKit) {
+    init(account: Account, kit: NextcloudKit) {
+        self.account = account
         self.kit = kit
     }
 
@@ -35,6 +38,7 @@ class ShareeSuggestionsDataSource: SuggestionsDataSource {
                 search: inputString,
                 page: 1,
                 perPage: 20,
+                account: account.ncKitAccount,
                 completion: { account, sharees, data, error in
                     defer { continuation.resume(returning: sharees ?? []) }
                     guard error == .success else {